package br.com.farmabid.produto;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.inject.Inject;

import br.com.caelum.vraptor.Consumes;
import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.serialization.gson.WithoutRoot;
import br.com.caelum.vraptor.view.Results;
import br.com.farmabid.controller.BasicController;

@Controller
public class ProdutoWSController extends BasicController {
	@Inject ProdutoDAO produtoDAO;
	
	@Inject
    public ProdutoWSController(Result result, ResourceBundle bundle) {
		this.result = result;
		this.bundle = bundle;
	}
	
	public ProdutoWSController(){}
	
	@Consumes(value="application/json", options=WithoutRoot.class)
	@Post
    @Path(value = "/recuperaProdutos")
	public void recuperaProdutos(ProdutoVO prodVO) {
		List<Produto> listaProdutos = produtoDAO.recuperaProdutosPorNomeLike(prodVO.getNome());
		if(listaProdutos != null && listaProdutos.size() > 0){
			List<ProdutoVO> listaProdutosVO = new ArrayList<ProdutoVO>();
			for(Produto produto : listaProdutos){
				incrementaContadorBusca(produto);
				listaProdutosVO.addAll(produtoDAO.converteProdutoParaProdutoVO(produto));
			}
			result.use(Results.json()).withoutRoot().from(listaProdutosVO).recursive().serialize();
		} else {
			result.use(Results.json()).from("").serialize();
		}
	}
	
	private void incrementaContadorBusca(Produto produto){
		ProdutoEstatistica prodEst = produtoDAO.recuperaEstatisticasProduto(produto);
		if(prodEst != null){
			if(prodEst.getQuantidadeBuscado() != null){
				prodEst.setQuantidadeBuscado(prodEst.getQuantidadeBuscado() + 1);
			} else {
				prodEst.setQuantidadeBuscado(1);
			}
			produtoDAO.update(prodEst);
		} else {
			prodEst = new ProdutoEstatistica();
			prodEst.setProduto(produto);
			prodEst.setQuantidadeBuscado(1);
			produtoDAO.save(prodEst);
		}
	}
	
	@Consumes("application/json")
	@Post
    @Path(value = "/recuperaProdutoDetalhe")
	public void recuperaProdutoDetalhe(String id) {
		result.use(Results.json()).withoutRoot().from(produtoDAO.find(Produto.class, Integer.parseInt(id))).serialize();
	}
	
	@Get
    @Path(value = "/recuperaCategorias")
	public void recuperaCategorias() {
		List<CategoriaProduto> listaCategorias = (List<CategoriaProduto>) produtoDAO.recuperaCategoriasFilho();
		if(listaCategorias != null && listaCategorias.size() > 0){
			result.use(Results.json()).withoutRoot().from(listaCategorias).serialize();
		} else {
			result.use(Results.json()).from("").serialize();
		}
	}
	
	@SuppressWarnings("unchecked")
	@Get
    @Path(value = "/recuperaApresentacao")
	public void recuperaApresentacao() {
		List<Apresentacao> listaApresentacao = (List<Apresentacao>) produtoDAO.recuperaTodos(Apresentacao.class);
		if(listaApresentacao != null && listaApresentacao.size() > 0){
			result.use(Results.json()).withoutRoot().from(listaApresentacao).serialize();
		} else {
			result.use(Results.json()).from("").serialize();
		}
	}
	
	@Get
    @Path(value = "/recuperaFormaUso")
	public void recuperaFormaUso() {
		List<FormaUso> listaFormaUso = (List<FormaUso>) produtoDAO.recuperaTodos(FormaUso.class);
		if(listaFormaUso != null && listaFormaUso.size() > 0){
			result.use(Results.json()).withoutRoot().from(listaFormaUso).serialize();
		} else {
			result.use(Results.json()).from("").serialize();
		}
	}
	
	@Get
    @Path(value = "/recuperaProdutosMaisBuscados")
	public void recuperaProdutosMaisBuscados() {
		List<ProdutoEstatistica> listaProdutoEstatistica = (List<ProdutoEstatistica>) produtoDAO.recuperaProdutosMaisBuscados(20);
		if(listaProdutoEstatistica != null && listaProdutoEstatistica.size() > 0){
			List<ProdutoVO> listaProdutosVO = new ArrayList<ProdutoVO>();
			for(ProdutoEstatistica produto : listaProdutoEstatistica){
				List<ProdutoVO> listaProdutosVOTemp = produtoDAO.converteProdutoParaProdutoVO(produto.getProduto());
				//seta as quantidades
				for(ProdutoVO produtoVO : listaProdutosVOTemp){
					produtoVO.setQuantidadeBuscado(produto.getQuantidadeBuscado());
				}
				listaProdutosVO.addAll(listaProdutosVOTemp);
				
			}
			
			result.use(Results.json()).withoutRoot().from(listaProdutosVO).recursive().serialize();
		} else {
			result.use(Results.json()).from("").serialize();
		}
	}
	
	@Get
    @Path(value = "/recuperaProdutosDestaque")
	public void recuperaProdutosDestaque() {
		List<ProdutoVO> listaProdutoDestaque = (List<ProdutoVO>) produtoDAO.recuperaProdutosDestaque(3);
		if(listaProdutoDestaque != null && listaProdutoDestaque.size() > 0){
			result.use(Results.json()).withoutRoot().from(listaProdutoDestaque).recursive().serialize();
		} else {
			result.use(Results.json()).from("").serialize();
		}
	}

	@Override
	protected void redirect() {}

}
